// 导入工具函数，包括判断空值、显示成功提示、克隆对象和消息提示函数
import { isNull, showSuccess, clone, msg, showError } from '/@/utils';
// 导入常量枚举
import { enumCode } from '/@/const';
// 导入确认对话框钩子函数
import { useConfirmDialog } from '/@/hooks';
// 导入库存入库相关的 API 和数据类型
import { TraPeiXueApi, TraPeiXueInput, TraPeiXueOutput, TraPeiXueMingXiInput, TraPeiXueMingXiOutput } from '/@/api/tra/TraPeiXue';
import { InvKuCunOutput } from '/@/api/inv/InvKuCun';
import { TraShenQingDanOutput } from '/@/api/tra/TraShenQing/dto/TraShenQingDanOutput';
import { defineEmits, reactive, ref } from 'vue';

// 定义一个函数，返回独立实例状态
export function useTraJiaoChaPeiXue() {
	//#region props处理
	/**
	 * 定义 props 类型，需要同步写入props的类型
	 */
	const ctxProps: Ref<{ shenQingDanInfo?: TraShenQingDanOutput }> = ref({});
	/**
	 * 初始化 props
	 * @param props 传入的 props 对象
	 */
	const initProps = (props: { shenQingDanInfo?: TraShenQingDanOutput }) => {
		ctxProps.value = props;
	};
	//#endregion
	/**
	 * 定义事件类型
	 */
	const ctxEmits = ref<Function>(() => { });
	/**
	 * 初始化
	 */
	const initEmits = (emits: Function) => {
		ctxEmits.value = emits;
	};
	// 写一个判断单据状态的计算属性并且传出去
	const isCanEdit = computed(() => {
		return ctxProps.value?.shenQingDanInfo?.traShenQing.id && !ctx.zhuBiao.id
	});
	// 定义各个组件的引用
	const billPanelRef = ref();
	const formRef = ref();
	const listRef = ref();
	const scanRef = ref();
	const editPageRef = ref();
	const shenQingDanRef = ref();
	/**
	 * 初始化上下文对象
	 * @returns 包含初始状态的上下文对象
	 */
	const initCtx = () => ({
		// 标识是否处于编辑状态
		isEdit: false,
		// 标识是否正在加载数据
		loading: false,
		// 主表数据，默认单据类型为交叉配血
		zhuBiao: {
			id: '',
			tenantId: undefined,
			traShenQingId: undefined,
			danJuLeiXing: '交叉配血',
			peiXueCiShu: undefined,
			remark: undefined,
			createTime: undefined,
			createUserId: undefined,
			createUserName: undefined,
			updateTime: undefined,
			updateUserId: undefined,
			updateUserName: undefined,
			danJuZhuangTai: undefined,
			biaoBenHao: undefined,
			peiXingLeiXing: undefined,
		} as TraPeiXueInput,
		peiXueMingXi: {
			traPeiXueId: '',
			peiXueFangFa: '',
			fuHePeiXueFangFa: '',
			zhuCe: '',
			ciCe: '',
			peiXueJieGuo: '',
			id: undefined,
			xueYeId: undefined,
			peiXueRiQi: undefined,
			peiXueRenId: undefined,
			fuHeRenId: undefined,
			xueYe: undefined,
		} as TraPeiXueMingXiInput,
		// 明细表格数据
		mingXiTable: [] as TraPeiXueMingXiInput[],
		date: new Date()
	});

	// 使用 reactive 初始化响应式上下文对象
	const ctx = reactive(initCtx());
	//  ============================================= 主表 ====================================
	const edit = () => {
		ctx.isEdit = true;
	};
	/**
	 * 清空表单数据，初始化实体
	 */
	const newEntity = () => {
		console.log(123);

		// 将上下文对象重置为初始状态
		Object.assign(ctx, initCtx());
		// 设置为编辑状态
		ctx.isEdit = true;
		// 让扫码框获得焦点
		scanRef.value?.focus();
	};

	/**
	 * 列表 -- 查看按钮的处理函数，加载实体数据
	 * @param zhuBiao 主表数据
	 */
	const loadEntity = async (zhuBiao: TraPeiXueOutput) => {
		try {
			console.log('查看按钮的处理函数，加载实体数据', zhuBiao);
			// 检查主表数据或其 ID 是否为空，若为空则直接返回
			if (isNull(zhuBiao) || isNull(zhuBiao.id)) return;
			// 调用 API 的 get 方法获取数据
			const { traShenQingPeiXueZhuBiaoInput, traShenQingPeiXueZiBiaoList } = await TraPeiXueApi.get(zhuBiao.id);
			// 重置表单字段
			formRef.value.resetFields();
			// 将获取到的主表数据赋值给上下文对象的主表属性
			ctx.zhuBiao = traShenQingPeiXueZhuBiaoInput;
			// 将获取到的明细列表数据赋值给上下文对象的明细表格属性
			ctx.mingXiTable = traShenQingPeiXueZiBiaoList;
			// 设置为非编辑状态
			ctx.isEdit = false;
			// 获取申请单
			ctxEmits.value('danju-change', { id: ctx.zhuBiao.traShenQingId });
		} catch (e) {
			console.log('查看按钮的处理函数，加载实体数据', e);
		}
	};

	/**
	 * 提交表单数据
	 */
	const submit = async () => {
		// 进行表单验证
		const validate = await formRef?.value?.validate();
		// 若验证不通过则直接返回
		if (!validate) return;
		if (!ctxProps.value.shenQingDanInfo || !ctxProps.value.shenQingDanInfo.traShenQing.id) {
			showError('请选择申请单！');
			return;
		}
		if (ctx.mingXiTable.length == 0) {
			showError('请添加配血血液！');
			return;
		}
		ctx.zhuBiao.traShenQingId = ctxProps.value.shenQingDanInfo.traShenQing.id;
		// 若主表 ID 为空，说明是新增操作
		if (isNull(ctx.zhuBiao.id)) {
			// 设置单据状态为已生效
			ctx.zhuBiao.danJuZhuangTai = enumCode.Djzt.已生效;
			// 调用库存入库 API 的 add 方法添加数据，并更新主表数据
			ctx.zhuBiao = await TraPeiXueApi.add({ traShenQingPeiXueZhuBiaoInput: ctx.zhuBiao, traShenQingPeiXueZiBiaoList: ctx.mingXiTable });
			// 提交后做事件派发
			ctxEmits.value('submitCallBack', ctx.zhuBiao.id)
		} else {
			// 入库后明细不能再修改，只能修改主表，此处注释掉更新明细的代码
			// await InvRuKuApi.update({ ...ctx.zhuBiao, mingXiList: ctx.mingXiTable });
		}
		// 显示成功提示
		showSuccess();
		// 设置为非编辑状态
		ctx.isEdit = false;
	};

	/**
	 * 作废单据
	 */
	const cancel = () => {
		// 显示确认对话框
		useConfirmDialog('确认作废吗?').then(() => {
			showSuccess('已作废');
		});
	};

	//  ============================================= 明细 ====================================

	/**
	 * 删除血液明细数据
	 * @param row 要删除的明细行数据
	 */
	const deleteBlood = (row: any) => {
		// 在控制台输出删除方法执行信息和要删除的明细项 ID
		console.log('删除方法执行', row.id);
		// 过滤掉要删除的明细项
		ctx.mingXiTable = ctx.mingXiTable.filter((item) => item.xueYeId !== row.xueYeId);
		// 显示删除成功提示
		showSuccess('已删除');
	};

	/**
	 * 血液扫码流程相关方法：获取扫码信息
	 * @param code 扫码获取的条码信息
	 */
	const getBarcode = async (blood: InvKuCunOutput) => {
		try {
			console.log('获取扫码信息', blood, ctxProps.value.shenQingDanInfo);
			// 若条码信息为空则直接返回
			if (!blood.id) return;
			if (!ctxProps.value.shenQingDanInfo || !ctxProps.value.shenQingDanInfo.traShenQing.id) {
				showError('请选择申请单！');
				return;
			}
			const existBills = await TraPeiXueApi.getPeiXueBloodExists(blood.id);
			if (existBills.length > 0) {
				await useConfirmDialog(`该血液已存在单据${existBills.join(',')},是否继续添加?`);
			}
			let isExist = ctx.mingXiTable.some((item) => item.xueYeId === blood.id);
			if (isExist) {
				// 若已存在则显示错误提示
				msg.error('该血液已存在!');
				return;
			}
			ctx.mingXiTable.push({ ...ctx.peiXueMingXi, xueYeId: blood.id, xueYe: blood });
			// 根据条码到后台查询血液信息
			console.log('根据条码到后台查询血液信息', blood);
		} catch (e) {
			console.log('获取扫码信息失败', e);
		}
	};

	/**
	 * 手工入库的打印操作
	 */
	const print = () => {
		// 调用单据面板组件的 printWeb 方法进行打印
		billPanelRef.value.printWeb('billno', 'detail');
		// 显示打印成功提示
		showSuccess('打印');
	};
	/**
	 * 获取申请单
	 */
	const handleGetShenQing = (shenQingDan: any) => {
		console.log('获取申请单', shenQingDan);
	};

	return {
		ctxProps,
		initProps,
		ctxEmits,
		initEmits,
		billPanelRef,
		formRef,
		listRef,
		scanRef,
		editPageRef,
		shenQingDanRef,
		ctx,
		isCanEdit,
		edit,
		newEntity,
		loadEntity,
		submit,
		cancel,
		deleteBlood,
		getBarcode,
		print,
		handleGetShenQing
	};
}
